package code.reptile.core;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>解析Html</p>
 *
 * @version 1.0
 * @author:huangwf
 * @date:2017/8/21 14:24
 * @history
 */
public class AnalzeHtml {

    public final static String HTML_ATTR = "HTMLATTR";
    public final static String HTML_TEXT = "HTMLTEXT";

    //解析html
    public static List<Map<String, Object>> analzeHtmlById(String path, String id, String tag, String attr) {

        //读取本地html的路径
        File file = new File(path);
        //生成一个数组用来存储这些路径下的文件名
        File[] array = file.listFiles();
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        //写个循环读取这些文件的名字
        for (File anArray : array != null ? array : new File[0]) {
            try {
                if (anArray.isFile()) {
                    //输出html文件名字
                    System.out.println("正在解析网址：" + anArray.getName());

                    //下面开始解析本地的html
                    Document doc = Jsoup.parse(anArray, "UTF-8");
                    //得到标签的属性id为id下所有内容
                    Element content = doc.getElementById(id);
                    //分离出html下标签<tag></tag>之间的所有东西
                    Elements links = content.getElementsByTag(tag);
                    for (Element link : links) {
                        Map<String, Object> map = new HashMap<String, Object>();
                        //得到标签里元素中的值
                        String linkAttr = link.attr(attr);
                        map.put(HTML_ATTR, linkAttr);
                        //得到标签里面的字符串
                        String linkText = link.text();
                        map.put(HTML_TEXT, linkText);
                        list.add(map);
                    }
                }
            } catch (Exception e) {
                System.out.println("网址：" + anArray.getName() + "解析出错");
                e.printStackTrace();
            }
        }
        return list;
    }

    //解析html
    public static List<Map<String, Object>> analzeHtmlByClass(String path, String className, String tag, String attr) {

        //读取本地html的路径
        File file = new File(path);
        //生成一个数组用来存储这些路径下的文件名
        File[] array = file.listFiles();
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        //写个循环读取这些文件的名字
        for (File anArray : array != null ? array : new File[0]) {
            try {
                if (anArray.isFile()) {
                    //输出html文件名字
                    System.out.println("正在解析网址：" + anArray.getName());

                    //下面开始解析本地的html
                    Document doc = Jsoup.parse(anArray, "UTF-8");
                    //得到标签的属性id为id下所有内容
                    Elements contents = doc.getElementsByClass(className);
                    for (Element content : contents) {//分离出html下标签<tag></tag>之间的所有东西

                        Elements links = content.getElementsByTag(tag);
                        for (Element link : links) {
                            Map<String, Object> map = new HashMap<String, Object>();
                            //得到标签里元素中的值
                            String linkAttr = link.attr(attr);
                            map.put(HTML_ATTR, linkAttr);
                            //得到标签里面的字符串
                            String linkText = link.text();
                            map.put(HTML_TEXT, linkText);
                            list.add(map);
                        }
                    }
                }
            } catch (Exception e) {
                System.out.println("网址：" + anArray.getName() + "解析出错");
                e.printStackTrace();
            }
        }
        return list;
    }

    /**
     * <p>解析path文件夹下所以html文件</p>
     *
     * @author:huangwf
     * @date:2017/8/21 15:43
     * @version 1.0
     * @history
     */
    public static List<Document> analzeListHtml(String path) {

        //读取本地html的路径
        File file = new File(path);
        //生成一个数组用来存储这些路径下的文件名
        File[] array = file.listFiles();
        List<Document> list = new ArrayList<Document>();
        //写个循环读取这些文件的名字
        for (File anArray : array != null ? array : new File[0]) {
            try {
                if (anArray.isFile()) {
                    //输出html文件名字
                    System.out.println("正在解析网址：" + anArray.getName());

                    //下面开始解析本地的html
                    Document doc = Jsoup.parse(anArray, "UTF-8");
                    list.add(doc);
                }
            } catch (Exception e) {
                System.out.println("网址：" + anArray.getName() + "解析出错");
                e.printStackTrace();
            }
        }
        return list;
    }

    /**
     * <p>解析htmld单个文件</p>
     *
     * @author:huangwf
     * @date:2017/8/21 15:43
     * @version 1.0
     * @history
     */
    public static Document analzeHtml(String htmlName) {
        File file = new File(htmlName);
        try {
            if (file.isFile()) {
                //输出html文件名字
                System.out.println("正在解析网址：" + file.getName());
                //下面开始解析本地的html
                Document doc = Jsoup.parse(file, "UTF-8");
                return doc;
            }
        } catch (Exception e) {
            System.out.println("网址：" + file.getName() + "解析出错");
            e.printStackTrace();
        }
        return null;
    }

    public static Element analzeHtmlById(Document doc, String id) {
        return doc.getElementById(id);
    }

    public static Elements analzeHtmlByClass(Document doc, String className) {
        return doc.getElementsByClass(className);
    }

    public static Elements analzeHtmlByTag(Document doc, String tag) {
        return doc.getElementsByTag(tag);
    }

    public static Element analzeHtmlById(Element element, String id) {
        return element.getElementById(id);
    }

    public static Elements analzeHtmlByClass(Element element, String className) {
        return element.getElementsByClass(className);
    }

    public static Elements analzeHtmlByTag(Element element, String tag) {
        return element.getElementsByTag(tag);
    }

    public static String analzeHtmlByText(Element element, String txet) {
        return element.text();
    }

    public static String analzeHtmlByAttr(Element element, String attr) {
        return element.attr(attr);
    }
}
